package logica;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import persistencia.DAOBusqueda;
import persistencia.DAOClientes;
import modeloDatos.*;

public class OperacionesBusqueda {

	private DAOBusqueda daoB;
	
	public OperacionesBusqueda() {
		daoB =  new DAOBusqueda();
	}
	
	public List<String> recuperarIntereses(){
		List<String> res = daoB.recuperarIntereses();
		return res;
	}
	
	public List<String> recuperarServicios(){
		List<String> res = daoB.recuperarServicios();
		return res;
	}
	
	public Map<Integer,String> mapaEntidadesJuridicas(){
		return daoB.mapaEntidadesJuridicas();
	}
	
	public Map<Integer,String> mapaTiposEmpresa(){
		return daoB.mapaTiposEmpresa();
	}
	public List<String> recuperarEntidadesJuridicas(){
		List<String> res = daoB.recuperarEntidadesJuridicas();
		return res;
	}
	
	public List<String> recuperarTiposEmpresa(){
		List<String> res = daoB.recuperarTiposEmpresa();
		return res;
	}
	
	public List<Cliente> realizarBusquedaClientes(String nCB,String pJ, String[] iB, String[] sB, String[] eB,String[] tB,String list){
		List<Cliente> res = new LinkedList<Cliente>();
		List<Cliente> respJ = new LinkedList<Cliente>();
		List<Cliente> resiB = new LinkedList<Cliente>();
		List<Cliente> ressB = new LinkedList<Cliente>();
		List<Cliente> reseB = new LinkedList<Cliente>();
		List<Cliente> restB = new LinkedList<Cliente>();
		Boolean nombre = !(nCB.toString().equals("indiferente"));
		Boolean personaJ = !(pJ.toString().equals("indiferente"));
		Boolean intereses = !(iB[0].toString().equals("indiferente"));
		Boolean servicios = !(sB[0].toString().equals("indiferente"));
		Boolean entidades = !(eB[0].toString().equals("indiferente"));
		Boolean tipos = !(tB[0].toString().equals("indiferente"));
		Boolean listar = !(list.toString().equals("todos"));
		Boolean noSol = false;
		Boolean potencial = false;
		if(listar){
			if(list.toString().equals("potenciales")){
				potencial=true;
			}else if(list.toString().equals("comerciales")){
				potencial=false;
			}
			DAOClientes daoC = new DAOClientes();
			res = daoC.verClientesPotenciales(potencial); 
		}else{
			DAOClientes daoC = new DAOClientes();
			res = daoC.verTodosClientes();
		}
		if (personaJ) {
			Boolean pJBool;
			if (pJ.toString().equals("cif")) {
				pJBool = true;
			} else {
				pJBool = false;
			}
			respJ = daoB.buscarPersonaJuridica(pJBool);
			if (respJ.isEmpty()) {
				noSol = true;
			}
		}
		if (intereses && (!noSol)) {
			String conjuntoIntereses = "";
			for (String s : iB) {
				conjuntoIntereses = conjuntoIntereses + "'" + s.toString()
						+ "'" + ",";
			}
			int tam = conjuntoIntereses.length();
			tam = tam - 1;
			conjuntoIntereses = conjuntoIntereses.substring(0, tam);
			resiB = daoB.buscarClienteInteres(conjuntoIntereses);
			if (resiB.isEmpty()) {
				noSol = true;
			}
		}
		if (servicios && (!noSol)) {
			String conjuntoServicios = "";
			for (String s : sB) {
				conjuntoServicios = conjuntoServicios + "'" + s.toString()
						+ "'" + ",";
			}
			int tam = conjuntoServicios.length();
			tam = tam - 1;
			conjuntoServicios = conjuntoServicios.substring(0, tam);
			ressB = daoB.buscarClienteServicio(conjuntoServicios);
			if (ressB.isEmpty()) {
				noSol = true;
			}
		}
		if (entidades && (!noSol)) {
			String conjuntoEntidades = "";
			for (String s : eB) {
				conjuntoEntidades = conjuntoEntidades + "'" + s.toString()
						+ "'" + ",";
			}
			int tam = conjuntoEntidades.length();
			tam = tam - 1;
			conjuntoEntidades = conjuntoEntidades.substring(0, tam);
			reseB = daoB.buscarClienteEntidades(conjuntoEntidades);
			if (reseB.isEmpty()) {
				noSol = true;
			}
		}
		if (tipos && (!noSol)) {
			String conjuntoTipos = "";
			for (String s : tB) {
				conjuntoTipos = conjuntoTipos + "'" + s.toString()
						+ "'" + ",";
			}
			int tam = conjuntoTipos.length();
			tam = tam - 1;
			conjuntoTipos = conjuntoTipos.substring(0, tam);
			restB = daoB.buscarClienteTipos(conjuntoTipos);
			if (restB.isEmpty()) {
				noSol = true;
			}
		}
		if (personaJ) {
			res = combinaListas(res, respJ);
		}
		if (intereses) {
			res = combinaListas(res, resiB);
		}
		if (servicios) {
			res = combinaListas(res, ressB);
		}
		if (entidades) {
			res = combinaListas(res, reseB);
		}
		if (tipos) {
			res = combinaListas(res, restB);
		}
		if (nombre) {
			res = filtrarNombre(res, nCB);
		}
		return res;
	}
	
	public List<Cliente> combinaListas(List<Cliente> res, List<Cliente> comb){
		List<Cliente> resList = new LinkedList<Cliente>();
		if(res.isEmpty()||comb.isEmpty()){
			return resList;
		}else{
			for(Cliente c1: res){
				for(Cliente c2:comb){
					if(c1.getIdClienteEmpresa()==(c2.getIdClienteEmpresa())){
						resList.add(c2);
					}
				}
			}
			return resList;
		}
		
	}
	
	public List<Cliente> filtrarNombre(List<Cliente> lC, String nCB){
		List<Cliente> resList = new LinkedList<Cliente>();
		for(Cliente c : lC){
			if(c.getNombre().toLowerCase().matches(nCB.toLowerCase())){
				resList.add(c);
			}
			if(c.getNombre().toLowerCase().contains(nCB.toLowerCase())){
				resList.add(c);
			}
		}
		return resList;
	}
	
	public List<Cliente> filtrarPotenciales(List<Cliente> lC, Boolean pot){
		List<Cliente> resList = new LinkedList<Cliente>();
		for(Cliente c : lC){
			if(c.getPotencial().equals(pot)){
				resList.add(c);
			}
		}
		return resList;
	}
}
